package org.lanqiao.tjut.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.lanqiao.tjut.db.DBDriverFactory;
import org.lanqiao.tjut.entity.Dice;
import org.lanqiao.tjut.entity.Game;
import org.lanqiao.tjut.entity.GameScore;
import org.lanqiao.tjut.entity.Players;

public class GameService {
	/**
	 * 获得当前游戏厅的游戏信息
	 * 
	 * @param lstGame
	 *            查询的游戏信息
	 * @return
	 */
	public List initGame() {
		System.out.println("当前游戏大厅开放的游戏有：");
		// 数据库操作语言
		String strSql = "SELECT * FROM  PTGAME";
		// 进行数据库操作，并将查询信息存入list集合中
		List lstGame = DBDriverFactory.getDBDriverInstance().query(strSql, new BeanListHandler<Game>(Game.class));
		// 将list集合按照 自己的格式遍历打印出来
		for (int i = 0; i < lstGame.size(); i++) {
			Game game = (Game) lstGame.get(i);
			System.out.println(i + "-" + game.getGamename() + "-" + (game.getGamerule() == 0 ? "比大" : "比小"));
		}
		return lstGame;

	}

	/**
	 * 选择游戏
	 * 
	 * @param lstGame
	 *            查询的游戏信息
	 * @return 选择游戏编号
	 */
	public Game selGame(List<Game> lstGame) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请选择游戏编号：");
		int gameNum = sc.nextInt();
		// 如果输入的游戏编号不符合要求
		if (gameNum < lstGame.size()) {
			// 输入正确则返回选择的游戏编号
			return lstGame.get(gameNum);
		} else {
			// 提示其重新选择游戏编号
			System.out.println("输入错误！请重新选择：");
			return selGame(lstGame);
		}
	}

	/**
	 * 进行玩家注册会员以及玩家组队
	 * 
	 * @param playerQueue
	 *            玩家队列
	 */
	public void initPlayers(List playerQueue) {
		Scanner sc = new Scanner(System.in);
		System.out.println("现在开始进行组队...");
		while (true) {
			System.out.println("请输入玩家ID：");
			int playId = sc.nextInt();
			// 判断该玩家是否已经注册过会员
			boolean isExist = isPlayexisted(playId);
			if (!isExist) {
				// 没有注册过，则输入其他信息进行注册
				System.out.println("该玩家还不是会员！请先注册：");
				System.out.println("请输入玩家姓名：");
				String playName = sc.next();
				System.out.println("请输入玩家性别：");
				String playSex = sc.next();
				// 将玩家信息存入数据库中
				String strSql = "INSERT INTO PTPLAYERS(PLAYERID,PLAYERNAME,PLAYERSEX)VALUES(?,?,?)";
				int i = DBDriverFactory.getDBDriverInstance().update(strSql,
						new Object[] { playId, playName, playSex });
				if (i > 0) {
					System.out.println("该玩家注册会员成功！");
					// 如果该玩家注册会员成功，则将该玩家加入玩家队列，等待游戏开始
					List lst = queryPlayer(playId);
					//必须这样写 不能写成playerQueue.add(lst);
					//会报错 java.lang.ClassCastException 类转换错误
					playerQueue.add(lst.get(0));
				} else {
					System.out.println("该玩家注册会员失败");
				}
			} else {
				// 如果该玩家已经是会员，则直接将该玩家加入玩家队列，等待游戏开始
				System.out.println("该玩家已是会员，现已加入玩家队列。");
				List lst = queryPlayer(playId);
				playerQueue.add(lst.get(0));
			}
			System.out.println("是否继续组队？-1停止，其他键继续");
			int inPut = sc.nextInt();
			if (inPut == (-1)) {
				break;
			}
		}
		System.out.println("组队结束,游戏马上开始...");
	}

	/**
	 * 游戏等待时间3秒
	 * 
	 */
	public void waitGame() {
		System.out.println("各玩家完成游戏，游戏结果请等待3秒...");
		try {
			// 延时3秒
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 开始游戏
	 * 
	 * @param playerQueue
	 *            游戏玩家队列
	 * @param game
	 *            选择的游戏
	 */
	public void playGame(List<Players> playerQueue, Game game) {
		// 创建一个骰子对象
		Dice dice = new Dice();
		// 创建玩家队列的成绩集合
		List<GameScore> lstGS = new ArrayList<GameScore>();
		// 开始游戏，每个玩家掷骰子
		for (int i = 0; i < playerQueue.size(); i++) {
			// 创建当前掷骰子玩家的实例对象
			Players player = playerQueue.get(i);
			// 创建玩家成绩的实例对象
			GameScore gameScore = new GameScore();
			// 设置玩家成绩实例对象的属性
			// 玩家id
			gameScore.setPlayerid(player.getPlayerid());
			// 游戏ID
			gameScore.setGameid(game.getGameid());
			// 玩家的点数
			gameScore.setPlascore(dice.rollDice(3));
			// 将设置好的玩家成绩实例对象存入成绩集合中
			lstGS.add(gameScore);
		}
		// 玩家队列掷骰子结束后，将玩家点数进行排序（玩家类中是进行的从大到小排序）
		Collections.sort(lstGS);
		// 创建一个点数值，其值根据游戏的规则确定，游戏的输赢与该值比较
		int mScore = 0;
		if (game.getGamerule() == 0) {
			// 如果是赌大
			mScore = lstGS.get(0).getPlascore();
		} else {
			// 如果是赌小
			mScore = lstGS.get(lstGS.size() - 1).getPlascore();
		}
		// 循环遍历游戏成绩表，判定每个玩家的比赛输赢
		for (int i = 0; i < lstGS.size(); i++) {
			// 获取每个成绩集合中每个玩家的实例对象
			GameScore gameScore = lstGS.get(i);
			// 设置玩家成绩类中的游戏结果的属性值（每个玩家的点数和mScore比较）
			gameScore.setPlaresult(mScore == gameScore.getPlascore() ? "赢" : "输");
			// 将参加游戏的玩家成绩信息显示出来
			System.out.println("玩家：" + gameScore.getPlayerid() + "  点数是：" + gameScore.getPlascore() + "  游戏结果为："
					+ gameScore.getPlaresult());
			// 将参加游戏的玩家成绩存入玩家成绩表中
			String strSql = "INSERT INTO PTGAMESCORE(PLAYERID,PLASCORE,PLARESULT,GAMEID)VALUES(?,?,?,?)";
			DBDriverFactory.getDBDriverInstance().update(strSql, new Object[] { gameScore.getPlayerid(),
					gameScore.getPlascore(), gameScore.getPlaresult(), gameScore.getGameid() });
		}
		System.out.println("本局游戏结束");
	}

	/**
	 * 根据已输入的玩家id从数据库中查找该玩家的信息
	 * 
	 * @param playId
	 *            输入的玩家ID
	 * @return 返回查询的该玩家的信息
	 */
	public List queryPlayer(Integer playId) {
		// 查询语句
		String strSql = "SELECT * FROM PTPLAYERS WHERE PLAYERID=?";
		// 查询结果
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new BeanListHandler<Players>(Players.class),
				new Object[] { playId });
		// 返回查询结果
		return lst;

	}

	/**
	 * 查询验证该玩家ID对象的玩家信息是否已经存在
	 * 
	 * @param playId
	 *            玩家ID
	 * @return 查询结果
	 */
	private boolean isPlayexisted(Integer playId) {
		// 查询语句
		String strSql = "SELECT * FROM PTPLAYERS WHERE PLAYERID = ?";
		// 查询结果
		List<Players> lst = DBDriverFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<Players>(Players.class), new Object[] { playId });
		// 返回判定的结果
		return lst != null && lst.size() > 0 ? true : false;

	}

}
